package shujia.day17.udpdemo1;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
    1:建立udp的socket服务.
    2:通过receive方法接收数据
    3:将收到的数据存储到数据包对象中
    4:通过数据包对象的功能来完成对接收到数据进行解析.
    5:可以对资源进行关闭


    UDP协议，发送的数据的时候，虽然发送端将数据封装在了数据包中，但是实际发送过程中是将数据解析出来进行传输
    所以到达接收的端的时候，需要接收端自己创建一个空的数据包进行接收数据，接收了之后，再对数据包中的数据进行解析
 */
public class ReceiveDemo1 {
    public static void main(String[] args) throws Exception{
        //DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。
        DatagramSocket ds = new DatagramSocket(10086);

        //创建一个空的数据包
        //DatagramPacket(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度的数据包 length 。指定包的大小和长度
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);


        //void receive(DatagramPacket p)
        ds.receive(datagramPacket); // 发生阻塞，直到有数据过来被接收

        //接收到的数据在数据包中，需要解析数据包中的数据
        byte[] data = datagramPacket.getData();
        //获取实际接收到的数据长度
        int length = datagramPacket.getLength();
        String info = new String(data, 0, length);

        InetAddress address = datagramPacket.getAddress();
        String ip = address.getHostAddress();
        String hostName = address.getHostName();
        System.out.println("主机名："+hostName+" ip地址："+ip+"发来一条消息：");
        System.out.println(info);


        //关闭资源
        ds.close();

    }
}
